#include <stdio.h>
#include <math.h>
#include <string.h>
#include "../common/lwmovie_coretypes.h"

static const int NUM_SUBBANDS			= 32;
static const int FILTER_SIZE			= 16;

// Canonical tables from the standard.  These are all divisible by 1/65536.

double dewindowBaseTable[FILTER_SIZE][NUM_SUBBANDS] =
{
	{
		0.0,			-0.000015259,	-0.000015259,	-0.000015259,
		-0.000015259,	-0.000015259,	-0.000015259,	-0.000030518,
		-0.000030518,	-0.000030518,	-0.000030518,	-0.000045776,
		-0.000045776,	-0.000061035,	-0.000061035,	-0.000076294,
		-0.000076294,	-0.000091553,	-0.000106812,	-0.000106812,
		-0.00012207,	-0.000137329,	-0.000152588,	-0.000167847,
		-0.000198364,	-0.000213623,	-0.000244141,	-0.000259399,
		-0.000289917,	-0.000320435,	-0.000366211,	-0.000396729,
	},
	{
		-0.000442505,	-0.000473022,	-0.000534058,	-0.000579834,
		-0.00062561,	-0.000686646,	-0.000747681,	-0.000808716,
		-0.00088501,	-0.000961304,	-0.001037598,	-0.001113892,
		-0.001205444,	-0.001296997,	-0.00138855,	-0.001480103,
		-0.001586914,	-0.001693726,	-0.001785278,	-0.001907349,
		-0.00201416,	-0.002120972,	-0.002243042,	-0.002349854,
		-0.002456665,	-0.002578735,	-0.002685547,	-0.002792358,
		-0.00289917,	-0.002990723,	-0.003082275,	-0.003173828,
	},
	{
		0.003250122,	0.003326416,	0.003387451,	0.003433228,
		0.003463745,	0.003479004,	0.003479004,	0.003463745,
		0.003417969,	0.003372192,	0.00328064,		0.003173828,
		0.003051758,	0.002883911,	0.002700806,	0.002487183,
		0.002227783,	0.001937866,	0.001617432,	0.001266479,
		0.000869751,	0.000442505,	-0.000030518,	-0.000549316,
		-0.001098633,	-0.001693726,	-0.002334595,	-0.003005981,
		-0.003723145,	-0.004486084,	-0.0052948,		-0.006118774,
	},
	{
		-0.007003784,	-0.007919312,	-0.008865356,	-0.009841919,
		-0.010848999,	-0.011886597,	-0.012939453,	-0.014022827,
		-0.01512146,	-0.016235352,	-0.017349243,	-0.018463135,
		-0.019577026,	-0.020690918,	-0.021789551,	-0.022857666,
		-0.023910522,	-0.024932861,	-0.025909424,	-0.02684021,
		-0.02772522,	-0.028533936,	-0.029281616,	-0.029937744,
		-0.030532837,	-0.031005859,	-0.031387329,	-0.031661987,
		-0.031814575,	-0.031845093,	-0.031738281,	-0.031478882,
	},
	{
		0.031082153,	0.030517578,	0.029785156,	0.028884888,
		0.027801514,	0.026535034,	0.025085449,	0.023422241,
		0.021575928,	0.01953125,		0.01725769,		0.014801025,
		0.012115479,	0.009231567,	0.006134033,	0.002822876,
		-0.000686646,	-0.004394531,	-0.00831604,	-0.012420654,
		-0.016708374,	-0.021179199,	-0.025817871,	-0.030609131,
		-0.035552979,	-0.040634155,	-0.045837402,	-0.051132202,
		-0.056533813,	-0.06199646,	-0.067520142,	-0.073059082,
	},
	{
		-0.07862854,	-0.084182739,	-0.089706421,	-0.095169067,
		-0.100540161,	-0.105819702,	-0.110946655,	-0.115921021,
		-0.120697021,	-0.125259399,	-0.129562378,	-0.133590698,
		-0.137298584,	-0.140670776,	-0.143676758,	-0.146255493,
		-0.148422241,	-0.150115967,	-0.151306152,	-0.15196228,
		-0.152069092,	-0.151596069,	-0.150497437,	-0.148773193,
		-0.146362305,	-0.143264771,	-0.139450073,	-0.134887695,
		-0.129577637,	-0.123474121,	-0.116577148,	-0.108856201,
	},
	{
		0.100311279,	0.090927124,	0.080688477,	0.069595337,
		0.057617187,	0.044784546,	0.031082153,	0.01651001,
		0.001068115,	-0.015228271,	-0.03237915,	-0.050354004,
		-0.069168091,	-0.088775635,	-0.109161377,	-0.130310059,
		-0.152206421,	-0.174789429,	-0.198059082,	-0.221984863,
		-0.246505737,	-0.271591187,	-0.297210693,	-0.323318481,
		-0.349868774,	-0.376800537,	-0.404083252,	-0.431655884,
		-0.459472656,	-0.487472534,	-0.515609741,	-0.543823242,
	},
	{
		-0.572036743,	-0.600219727,	-0.628295898,	-0.656219482,
		-0.683914185,	-0.71131897,	-0.738372803,	-0.765029907,
		-0.791213989,	-0.816864014,	-0.841949463,	-0.866363525,
		-0.890090942,	-0.91305542,	-0.935195923,	-0.956481934,
		-0.976852417,	-0.996246338,	-1.01461792,	-1.031936646,
		-1.048156738,	-1.063217163,	-1.07711792,	-1.089782715,
		-1.101211548,	-1.111373901,	-1.120223999,	-1.127746582,
		-1.133926392,	-1.138763428,	-1.142211914,	-1.144287109,
	},
	{
		1.144989014,	1.144287109,	1.142211914,	1.138763428,
		1.133926392,	1.127746582,	1.120223999,	1.111373901,
		1.101211548,	1.089782715,	1.07711792,		1.063217163,
		1.048156738,	1.031936646,	1.01461792,		0.996246338,
		0.976852417,	0.956481934,	0.935195923,	0.91305542,
		0.890090942,	0.866363525,	0.841949463,	0.816864014,
		0.791213989,	0.765029907,	0.738372803,	0.71131897,
		0.683914185,	0.656219482,	0.628295898,	0.600219727,
	},
	{
		0.572036743,	0.543823242,	0.515609741,	0.487472534,
		0.459472656,	0.431655884,	0.404083252,	0.376800537,
		0.349868774,	0.323318481,	0.297210693,	0.271591187,
		0.246505737,	0.221984863,	0.198059082,	0.174789429,
		0.152206421,	0.130310059,	0.109161377,	0.088775635,
		0.069168091,	0.050354004,	0.03237915,		0.015228271,
		-0.001068115,	-0.01651001,	-0.031082153,	-0.044784546,
		-0.057617187,	-0.069595337,	-0.080688477,	-0.090927124,
	},
	{
		0.100311279,	0.108856201,	0.116577148,	0.123474121,
		0.129577637,	0.134887695,	0.139450073,	0.143264771,
		0.146362305,	0.148773193,	0.150497437,	0.151596069,
		0.152069092,	0.15196228,		0.151306152,	0.150115967,
		0.148422241,	0.146255493,	0.143676758,	0.140670776,
		0.137298584,	0.133590698,	0.129562378,	0.125259399,
		0.120697021,	0.115921021,	0.110946655,	0.105819702,
		0.100540161,	0.095169067,	0.089706421,	0.084182739,
	},
	{
		0.07862854,		0.073059082,	0.067520142,	0.06199646,
		0.056533813,	0.051132202,	0.045837402,	0.040634155,
		0.035552979,	0.030609131,	0.025817871,	0.021179199,
		0.016708374,	0.012420654,	0.00831604,		0.004394531,
		0.000686646,	-0.002822876,	-0.006134033,	-0.009231567,
		-0.012115479,	-0.014801025,	-0.01725769,	-0.01953125,
		-0.021575928,	-0.023422241,	-0.025085449,	-0.026535034,
		-0.027801514,	-0.028884888,	-0.029785156,	-0.030517578,
	},
	{
		0.031082153,	0.031478882,	0.031738281,	0.031845093,
		0.031814575,	0.031661987,	0.031387329,	0.031005859,
		0.030532837,	0.029937744,	0.029281616,	0.028533936,
		0.02772522,		0.02684021,		0.025909424,	0.024932861,
		0.023910522,	0.022857666,	0.021789551,	0.020690918,
		0.019577026,	0.018463135,	0.017349243,	0.016235352,
		0.01512146,		0.014022827,	0.012939453,	0.011886597,
		0.010848999,	0.009841919,	0.008865356,	0.007919312,
	},
	{
		0.007003784,	0.006118774,	0.0052948,		0.004486084,
		0.003723145,	0.003005981,	0.002334595,	0.001693726,
		0.001098633,	0.000549316,	0.000030518,	-0.000442505,
		-0.000869751,	-0.001266479,	-0.001617432,	-0.001937866,
		-0.002227783,	-0.002487183,	-0.002700806,	-0.002883911,
		-0.003051758,	-0.003173828,	-0.00328064,	-0.003372192,
		-0.003417969,	-0.003463745,	-0.003479004,	-0.003479004,
		-0.003463745,	-0.003433228,	-0.003387451,	-0.003326416,
	},
	{
		0.003250122,	0.003173828,	0.003082275,	0.002990723,
		0.00289917,		0.002792358,	0.002685547,	0.002578735,
		0.002456665,	0.002349854,	0.002243042,	0.002120972,
		0.00201416,		0.001907349,	0.001785278,	0.001693726,
		0.001586914,	0.001480103,	0.00138855,		0.001296997,
		0.001205444,	0.001113892,	0.001037598,	0.000961304,
		0.00088501,		0.000808716,	0.000747681,	0.000686646,
		0.00062561,		0.000579834,	0.000534058,	0.000473022,
	},
	{
		0.000442505,	0.000396729,	0.000366211,	0.000320435,
		0.000289917,	0.000259399,	0.000244141,	0.000213623,
		0.000198364,	0.000167847,	0.000152588,	0.000137329,
		0.00012207,		0.000106812,	0.000106812,	0.000091553,
		0.000076294,	0.000076294,	0.000061035,	0.000061035,
		0.000045776,	0.000045776,	0.000030518,	0.000030518,
		0.000030518,	0.000030518,	0.000015259,	0.000015259,
		0.000015259,	0.000015259,	0.000015259,	0.000015259,
	},
};

int main(int argc, const char **argv)
{
	printf("// Generated by mp2maketable\n");
	printf("LWMOVIE_FIXEDREAL_SIMD_ALIGN_ATTRIB lwmSInt32 MP2_DEWINDOW_BASE[FILTER_SIZE][NUM_SUBBANDS] =\n");
	printf("{\n");
	for(int i=0;i<FILTER_SIZE;i++)
	{
		printf("\t{\n");
		for(int j=0;j<NUM_SUBBANDS;j++)
		{
			if(j % 4 == 0)
				printf("\t\t");
			double unscaledValue = dewindowBaseTable[i][j] * 65536.0;
			double error = fabs(unscaledValue - floor(unscaledValue + 0.5));
			char outputValue[20];
			sprintf(outputValue, "% d,", static_cast<lwmSInt32>(floor(unscaledValue + 0.5)));
			printf("%s", outputValue);
			if(j % 4 == 3)
			{
				printf("\n");
			}
			else
			{
				size_t trailingDigits = 8 - strlen(outputValue);
				size_t trailingTabs = (trailingDigits + 3) / 4;
				for(size_t i=0;i<trailingTabs;i++)
					printf("\t");
			}
		}
		printf("\t},\n");
	}
	printf("};\n");
	return 0;
}
